iT邦幫忙

2023 iThome 鐵人賽

DAY 16
1
AI & Data

ML From Scratch系列 第 16

[Day 16] Gaussian Mixture Model — 解決真實問題

  • 分享至 

  • xImage
  •  

今天我們會透過 Gaussian Mixture Model 來分析購物中心的客戶資料。

Mall Customer Segmentation Data

資料集的資料包括:

  • 客戶 ID
  • 性別
  • 年齡
  • 年收入
  • 花費指數

Implementation

  1. 讀取資料集並適當地重新命名列名
  2. 刪除 customerid 列,並將 Gender 列轉換為 [0,1]
  3. 使用 sklearn 的 StandardScaler() 對資料集進行標準化
  4. 使用高斯混合模型進行分群

Import Library

import numpy as np
import pandas as pd
import re
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.mixture import GaussianMixture

import warnings
warnings.filterwarnings("ignore")
  • from sklearn.cluster import KMeans:用於K均值聚類分析。
  • from sklearn.preprocessing import StandardScaler:用於標準化數據,即將數據轉換為均值為0,方差為1的分佈。
  • from sklearn.mixture import GaussianMixture:用於執行高斯混合模型(Gaussian Mixture Model,GMM)的聚類分析。

Load Dataset

# Reading dataset
df = pd.read_csv("../input/customer-segmentation-tutorial-in-python/Mall_Customers.csv")

Data Preprocess

# cleaning/renaming column names
df.rename(columns={'Annual Income (k$)':'AnnualIncome(k$)',
                   'Spending Score (1-100)':'SpendingScore(1-100)',
                  }, 
          inplace=True)       
          
# Dropping CustomerID column
df.drop(['CustomerID'], inplace = True, axis = 1) 


# Transforming Gender
df.Gender[df.Gender == 'Male'] = 1
df.Gender[df.Gender == 'Female'] = 0


df["age_cat"] = pd.cut(
                       df['Age'],
                       bins = [0,35,55,100],           # Else devise your bins: [0,20,60,110]
                       labels= ["y", "m", "s"]
                      )
                      
df["income_cat"] = pd.cut(
                           df['AnnualIncome(k$)'],
                           bins = 3,
                           labels= ["l", "m", "h"]
                         )

首先,使用 rename 方法,將資料框(DataFrame)的某些列名進行了重新命名。

接著,使用 drop 方法,刪除了資料框中的 "CustomerID" 這一列。這樣做的目的是去除不需要的客戶ID資訊。

同時,也對 "Gender" 這一列進行了轉換,將男性表示為1,女性表示為0。

接著使用 cut 方法,將 "Age" 這一列數值型特徵進行了分類。

將年齡區間劃分為三個類別:'y'(年輕)、'm'(中年)、's'(老年),並將結果存儲在新的 "age_cat" 列中。

最後,再次使用 cut 方法,這次是對 "AnnualIncome(k$)" 這一列進行分類。

它將年收入區間分為三個類別:'l'(低收入)、'm'(中等收入)、'h'(高收入),並將結果存儲在新的 "income_cat" 列中。

Scale dataset

# Drop Categorical Values
df.drop(columns=['age_cat', 'income_cat'], inplace=True)

# Scaling using StandardScaler
ss = StandardScaler()
ss.fit(df)
X = ss.transform(df)

先從資料框(DataFrame)中刪除名為 'age_cat''income_cat' 的列,這些列可能包含類別值或非數值資料。

接下來,使用 sklearn 中的 StandardScaler() 對剩餘的數值列進行標準化,將資料縮放為均值為0,標準差為1的標準分佈,並將標準化後的資料存儲在變數 X 中,以供後續的機器學習或統計分析使用。

Gaussian Mixture Modeling

# Perform clsutering
gm = GaussianMixture(
                     n_components = 2,
                     n_init = 10,
                     max_iter = 100)
                     
# Train the algorithm
gm.fit(X)

# Clusters labels
gm.predict(X)

最後,我們使用高斯混合模型 (Gaussian Mixture Model,縮寫為 GM) 來進行資料分群,並用已經訓練好的模型對資料集 X 進行預測。


完整的 code 可以去 Kaggle Notebook 實際執行喔~

明天要進入新的系列 Multilayer Perceptron / Neural Network

/images/emoticon/emoticon31.gif

Reference

歡迎更仔細閱讀以下相關內容以了解本篇知識


上一篇
[Day 15] Gaussian Mixture Model — 主題實作
下一篇
[Day 17] Multilayer Perceptron
系列文
ML From Scratch31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言